package com.kamistoat.meimeimall.meimeimallmember.interceptor;

import com.kamistoat.meimeimall.common.To.memberTo.LoginSuccessTo;
import com.kamistoat.meimeimall.common.constant.AuthConstant;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;
import org.springframework.util.AntPathMatcher;
import org.springframework.web.servlet.HandlerInterceptor;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * 已弃用。整个order服务的拦截器。和总的拦截器重合了。
 */
@Component
@Order(0)
public class LoginInterceptor implements HandlerInterceptor {

    // 创建一个ThreadLocal，专门保存登录成功时从session中拿出来的用户详情，将用于在之后的order服务与各项数据互联时使用
    public static ThreadLocal<LoginSuccessTo> loginUserThreadLocal = new ThreadLocal<>();


    /**
     * 在目标请求到达之前
     *
     * @param request
     * @param response
     * @param handler
     * @return
     * @throws Exception
     */
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        // 如果是服务之间的远程接口调用，应该直接放行，不要求登录
        String requestURI = request.getRequestURI();
        boolean matchFeign_1 = new AntPathMatcher().match("/web/**", requestURI);

        if (!matchFeign_1) {
            return true;
        }

        // 直接从拦截到的请求中把Session中用于标定用户登录的session拿出来
        LoginSuccessTo loginState = (LoginSuccessTo) request.getSession().getAttribute(AuthConstant.LOGINUSER_KEY);
        if (loginState != null) {
            // 已登录
            // 将登录用户信息保存到ThreadLocal，用于之后的使用
            loginUserThreadLocal.set(loginState);
            request.getSession().removeAttribute("message");
            return true;
        } else {
            // 没登录
            // 直接拦截，重定向用户登录，并在session中保存一个错误信息，这样登录页面可以提取出来
            request.getSession().setAttribute("message", "请先进行登录");
            response.sendRedirect("http://auth.meimeimall.com/login.html");
            return false;
        }
    }
}
